package 集合.模拟斗地主发牌功能;

import java.util.*;

/*
模拟发牌动作
      买牌
      洗牌
      发牌
      看牌
* */
public class text {
    public static void main(String[] args) {
        //买牌
        //定义一个双列集合 键：表示编号  值：表示具体的牌 规则：编号越小。拍越小
        Map<Integer, String> pokers = new HashMap<>();

        //定义一个单列集合，用来存储所有看牌动作
        List<Integer> list = new ArrayList<>();
        //实现买牌动作
        String[] colors = {"方块", "红桃", "梅花", "黑桃"};
        String[] number = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};
        int num = 0; //表示牌的编号

        //通过循环嵌套 造普通牌
        for (String numbers : number) {//外循点数，获取所有点数  外循环一次内循环一圈
            for (String color : colors) {
                String poker = color + numbers;
                //System.out.println(poker);
                //将牌的编号，具体的牌放到双列集合中
                pokers.put(num, poker);
                //将牌的编号放到单列集合中
                list.add(num);
                //每添加一张牌，编号要自增1
                num++;
            }
        }
        //大小王
        //添加小王
        pokers.put(num, "小王");
        list.add(num);
        num++;
        //添加大王
        pokers.put(num, "大王");
        list.add(num);
        //num++;
        System.out.println("所有的牌：" + pokers);
        System.out.println("所有的编号：" + list);


        //2洗牌
        Collections.shuffle(list);
        System.out.println("牌洗好后的编号" + list);


        //发牌
        //定义4个集合，分别表示3个玩家，底牌
        List<Integer> yihao = new ArrayList<>();
        List<Integer> erhao = new ArrayList<>();
        List<Integer> sanhao = new ArrayList<>();
        List<Integer> dipai = new ArrayList<>();

        //具体的发牌动作，将索引和3取模 决定发给谁
        for (int i = 0; i < list.size(); i++) {
            //获取编号
            Integer pokenum = list.get(i);
            //System.out.println(pokenum);
            if (i >= list.size() - 3) {
                //底牌
                dipai.add(pokenum);

            } else if (i % 3 == 0) {
                yihao.add(pokenum);
            } else if (i % 3 == 1) {
                erhao.add(pokenum);
            } else if (i % 3 == 2) {
                sanhao.add(pokenum);
            }
        }
        //查看玩家，底牌的编号
        System.out.println("yihao" + yihao);
        System.out.println("erhao" + erhao);
        System.out.println("sanhao" + sanhao);
        System.out.println("dipai" + dipai);

        System.out.println("----------------------");

        //查看具体的牌
        //String str = printpoker(yihao, pokers);
        //System.out.println(str);

        System.out.println("一号: " + printPoker(yihao, pokers));
        System.out.println("二号: " + printPoker(erhao, pokers));
        System.out.println("三号: " + printPoker(sanhao, pokers));
        System.out.println("底牌: " + printPoker(dipai, pokers));
    }

    //看牌
 /*
 * 定义一个方法，用来看牌
 *      方法名  printPoker
 *       参数列表  List<Integer> nums ,  Map<Integer,String>
          返回值 String
          * * * * * */
    public static String printPoker(List<Integer> nums, Map<Integer, String> pokers) {

        //对牌的编号进行升序排列

        Collections.sort(nums);
        //遍历牌的编号集合，获取到每个每个编号
        StringBuilder sb = new StringBuilder();
        for (Integer num : nums) {
            //根据编号去双列集合中查找该编号的具体牌

            String poker = pokers.get(num);
            //将获取的牌进行拼接
            sb.append(poker + " ");

        }
        //将最后的拼接结果返回即可
        String str = sb.toString();
        return str.trim();
    }


}


